import axios, { AxiosPromise, AxiosRequestConfig } from 'axios'
import { message } from 'antd'
import { clearLoginInfo, getLoginInfo } from '@/utils/storeTools'
import { pageSkip } from '@/utils/customTools'

// 自定义 axios 实例
export const request = axios.create({ timeout: 8000 })

// 请求拦截器, 配置请求头等信息
// request.interceptors.request.use(
//   (config) => {
//     if (config.url?.includes('/authApi/login/login')) return config
//     if (!getLoginInfo()) {
//       window.setTimeout(() => pageSkip('/login'), 1000)
//       return Promise.reject('暂未登录, 请您重新登录')
//     }
//     // @ts-ignore
//     config.headers.accessToken = getLoginInfo()?.access_token
//     return config
//   },
//   (error) => Promise.reject(error)
// )

// 响应拦截器, 对后台返回的数据做预处理
request.interceptors.response.use(
  async (response) => {
    if (response.status === 200) {
      if (response.config.url?.includes('/phoneApi')) {
        if (response.data.resultcode == '200') return response.data.result
        else {
          return Promise.reject()
        }
      } else if (response.config.url?.includes('/sfz')) {
        return response.data
      } else {
        return response
      }
    } else {
      return Promise.reject(response.statusText)
    }
  },
  (error) => Promise.reject(error),
)

/**
 * 配合 axios.all 使用, 完成并发网络请求
 * @param config axios 请求配置
 * @returns AxiosPromise<any>
 */
export const getRequest = (config: AxiosRequestConfig) => request({ method: 'POST', ...config })

// --------------------------------------------------- requestAll 使用示例 ---------------------------------------------------
// import { request, requestAll } from '@/utils/request'
// import { requestWideList, requestTimeTag } from '@/api/commonApi'
// useEffect(() => requestAll([requestWideList(), requestTimeTag()], [(_, dat) => console.log(dat), (_, dat) => console.log(dat)]), [])

/**
 * axios.all 的二次封装; requetses, callbacks 两个数组的长度应保持一致
 * @param requetses 网络请求列表
 * @param callbacks 网络请求的回调列表
 */
export const requestAll = (requetses: AxiosPromise<any>[], callbacks: ((suc: boolean, dat: any) => void)[]) => {
  axios
    .all(requetses)
    .then(axios.spread((...args) => callbacks.forEach((item, index) => item(true, args[index] === undefined ? [] : args[index]))))
    .catch((error) => {
      console.log('Axios :' + error)
      message.error({ content: 'Axios ' + error, className: 'message_error' })
      callbacks.forEach((item) => item(false, []))
    })
    .finally(() => {})
}

/**
 * 自定义通用请求
 * @param config axios 请求配置; { url: string, data: any , method?}
 * @param callback 请求后的回调
 */
export const myRequest = (config: AxiosRequestConfig, callback: (s: boolean, d: any) => void) => {
  request({ method: 'POST', ...config })
    .then((response: any) => callback(true, response))
    .catch((error) => {
      console.log('Axios :' + error)
      message.error({ content: 'Axios ' + error, className: 'message_error' })
      callback(false, [])
    })
}

// function getDeptAccount1() {
//   return axios.get('/sys/dept/123')
// }
// function getDeptPermissions1() {
//   return axios.get('/sys/dept/123/permissions')
// }
// axios.all([getDeptAccount1(), getDeptPermissions1()]).then(
//   // 注：acct   为 请求一 的返回值
//   //    perms  为 请求二 的返回值
//   axios.spread((acct, perms) => {
//     // 两个请求都完成后的操作
//   })
// )

// function getDeptAccount2() {
//   return axios.get('/sys/dept/123')
// }
// function getDeptPermissions2() {
//   return axios.get('/sys/dept/123/permissions')
// }
// Promise.all([getDeptAccount2(), getDeptPermissions2()]).then(([acct, perms]) => {
//   // 注: acct   为 Promise一 的返回值
//   //     perms  为 Promise二 的返回值
//   // 两个请求都完成后的操作
// })

// axios#request(config)
// axios#get(url[, config])
// axios#delete(url[, config])
// axios#head(url[, config])
// axios#options(url[, config])
// axios#post(url[, data[, config]])
// axios#put(url[, data[, config]])
// axios#patch(url[, data[, config]])

// interface AxiosRequestConfig<D = any> {
//   url?: string; // 请求的服务器 URL
//   method?: Method; // 创建请求时使用的方法
//   baseURL?: string; // 根地址
//   transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[]; // 允许在向服务器发送前，修改请求数据
//   transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[]; // 在传递给 then/catch 前，允许修改响应数据
//   headers?: AxiosRequestHeaders; // 负责 `params` 序列化的函数
//   params?: any; // 与请求一起发送的 URL 参数
//   paramsSerializer?: (params: any) => string;
//   data?: D; // 作为请求主体被发送的数据, 只适用于 'PUT', 'POST', 和 'PATCH'
//   timeout?: number; // 请求超时的毫秒数(0 表示无超时时间)
//   timeoutErrorMessage?: string;
//   withCredentials?: boolean; // 跨域请求时是否需要使用凭证, false
//   adapter?: AxiosAdapter; // 自定义处理请求，以使测试更轻松
//   auth?: AxiosBasicCredentials; // 使用 HTTP 基础验证，并提供凭据, 这将设置一个 `Authorization` 头，覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
//   responseType?: ResponseType; // 服务器响应的数据类型，可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认为 json
//   responseEncoding?: responseEncoding | string;
//   xsrfCookieName?: string;
//   xsrfHeaderName?: string;
//   onUploadProgress?: (progressEvent: any) => void;
//   onDownloadProgress?: (progressEvent: any) => void;
//   maxContentLength?: number;
//   validateStatus?: ((status: number) => boolean) | null;
//   maxBodyLength?: number;
//   maxRedirects?: number;
//   socketPath?: string | null;
//   httpAgent?: any;
//   httpsAgent?: any;
//   proxy?: AxiosProxyConfig | false;
//   cancelToken?: CancelToken;
//   decompress?: boolean;
//   transitional?: TransitionalOptions;
//   signal?: AbortSignal;
//   insecureHTTPParser?: boolean;
// }
